package com.jch.ft.util;

import com.jch.ft.domain.Constants;
import com.jch.ft.domain.FileBurstData;
import com.jch.ft.domain.FileBurstInstruct;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

// 传输文件读写工具类，分片读写处理类
public class FileUtil {

    // 分片读取文件
    public static FileBurstData readFile(String fileUrl,int readIndex) throws IOException {
        File file = new File(fileUrl);
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
        randomAccessFile.seek(readIndex); // 设置文件指针偏移位置
        // 读取文件指定字节长度内容
        byte[] bytes = new byte[1024 * 1024]; // 1片 1MB
        int readSize = randomAccessFile.read(bytes);
        if (readSize <= 0) { // 检查文件是否读取完成
            randomAccessFile.close();
            return new FileBurstData(Constants.FileStatus.COMPLETE);
        }
        FileBurstData fileInfo = new FileBurstData();
        fileInfo.setFileUrl(fileUrl);
        fileInfo.setFileName(file.getName());
        fileInfo.setBeginIndex(readIndex);
        fileInfo.setEndIndex(readIndex + readSize);

        // 去除不足1024字节时内填充的空字节
        if (readSize < bytes.length){
            byte[] copy = new byte[readSize];
            System.arraycopy(bytes,0,copy,0,readSize);
            fileInfo.setBytes(copy);
            fileInfo.setStatus(Constants.FileStatus.END);
        } else {
            fileInfo.setBytes(bytes);
            fileInfo.setStatus(Constants.FileStatus.MIDDLE);
        }
        randomAccessFile.close();
        return fileInfo;
    }

    // 分片写入文件
    public static FileBurstInstruct writeFile(String baseUrl,FileBurstData fileBurstData) throws IOException {

        // 检查文件是否传输完成
        if (Constants.FileStatus.COMPLETE == fileBurstData.getStatus()){
            return new FileBurstInstruct(Constants.FileStatus.COMPLETE);
        }

        // 分片写入
        File file = new File(baseUrl + "/" + fileBurstData.getFileName());
        // r : 只读操作
        // rw : 允许读写操作
        // rws：每当进行写操作，同步的刷新到磁盘，刷新内容和元数据
        // rwd：每当进行写操作，同步刷新新到磁盘，刷新内容
        RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rwd");
        randomAccessFile.seek(fileBurstData.getBeginIndex()); // 设置文件指针偏移位置
        randomAccessFile.write(fileBurstData.getBytes()); // 从指定位置开始写数据
        randomAccessFile.close();

        if (Constants.FileStatus.END == fileBurstData.getStatus()){
            return new FileBurstInstruct(Constants.FileStatus.COMPLETE);
        }

        // 文件分片传输指令
        FileBurstInstruct fileBurstInstruct = new FileBurstInstruct();
        fileBurstInstruct.setStatus(Constants.FileStatus.MIDDLE);
        fileBurstInstruct.setClientFileUrl(fileBurstData.getFileUrl());
        fileBurstInstruct.setReadIndex(fileBurstData.getEndIndex() + 1); // 读取位置

        return fileBurstInstruct;
    }
}
